package com.joyd.joydlib.dev

import android.accessibilityservice.AccessibilityService
import android.content.Context
import android.provider.Settings
import android.util.Log
import java.util.concurrent.TimeUnit

/**
 * 无障碍服务助手类
 * 用于管理无障碍服务的实例和状态
 */
object AccessibilityServiceHelper {
    private const val TAG = "AccessibilityServiceHelper"
    private var accessibilityService: JoydLibAccessibilityService? = null
    private val serviceCallbacks = mutableListOf<AccessibilityServiceCallback>()

    /**
     * 获取无障碍服务实例
     * @return 无障碍服务实例，如果未启用则返回null
     */
    fun getInstance(): AccessibilityService? {
        return accessibilityService
    }

    /**
     * 检查无障碍服务是否已启用
     * @param context 上下文
     * @return true表示已启用，false表示未启用
     */
    fun isEnabled(context: Context): Boolean {
        return try {
            // 由于JoydLibAccessibilityService类可能不存在，我们使用更宽松的检测方式
            // 检查Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES中是否包含我们应用的包名
            val enabledServices = Settings.Secure.getString(
                context.contentResolver,
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
            )
            
            if (enabledServices.isNullOrEmpty()) {
                return false
            }
            
            // 检查是否包含应用包名
            val packageName = context.packageName
            return enabledServices.contains(packageName)
        } catch (e: Exception) {
            Log.e(TAG, "检查无障碍服务状态失败", e)
            false
        }
    }
    
    /**
     * 检查指定的无障碍服务是否已启用
     * @param context 上下文
     * @param serviceClass 具体的无障碍服务实现类
     * @return true表示已启用，false表示未启用
     */
    fun isEnabled(context: Context, serviceClass: Class<*>): Boolean {
        return try {
            Log.e("ScreenTapExample", "检查无障碍服务状态")
            AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, serviceClass)
        } catch (e: Exception) {
            Log.e("ScreenTapExample", "检查无障碍服务状态失败", e)
            false
        }
    }

    /**
     * 检查无障碍服务是否已启用（无参数版本）
     * @return true表示已启用，false表示未启用
     */
    fun isEnabled(): Boolean {
        // 注意：此方法需要一个有效的上下文才能正常工作
        // 在实际使用中，应该使用带有Context参数的重载版本
        Log.w(TAG, "调用了无参数的isEnabled方法，可能无法正确获取状态")
        return accessibilityService != null
    }

    /**
     * 打开无障碍服务设置界面
     * @param context 上下文
     */
    fun openAccessibilitySettings(context: Context) {
        AccessibilityServiceUtils.goToAccessibilitySetting(context)
    }

    /**
     * 设置无障碍服务实例
     * @param service 无障碍服务实例
     */
    internal fun setService(service: JoydLibAccessibilityService?) {
        val wasEnabled = accessibilityService != null
        val isNowEnabled = service != null
        
        accessibilityService = service
        
        // 通知所有回调
        if (wasEnabled && !isNowEnabled) {
            // 服务断开
            notifyServiceDisconnected()
        } else if (!wasEnabled && isNowEnabled) {
            // 服务连接
            notifyServiceConnected()
        }
    }

    /**
     * 添加无障碍服务状态变化回调
     * @param callback 回调接口
     */
    fun addCallback(callback: AccessibilityServiceCallback) {
        synchronized(serviceCallbacks) {
            if (!serviceCallbacks.contains(callback)) {
                serviceCallbacks.add(callback)
            }
        }
    }

    /**
     * 移除无障碍服务状态变化回调
     * @param callback 回调接口
     */
    fun removeCallback(callback: AccessibilityServiceCallback) {
        synchronized(serviceCallbacks) {
            serviceCallbacks.remove(callback)
        }
    }

    /**
     * 等待无障碍服务启用
     * @param context 上下文
     * @param timeout 超时时间（毫秒）
     * @return true表示在超时前服务已启用，false表示超时
     */
    fun waitForEnabled(context: Context, timeout: Long = 60000): Boolean {
        return AccessibilityServiceUtils.waitForAccessibilityServiceEnabled(
            context, 
            JoydLibAccessibilityService::class.java, 
            timeout
        )
    }

    /**
     * 确保无障碍服务已启用
     * 如果未启用，则跳转到设置界面并等待用户启用
     * @param context 上下文
     * @param timeout 等待超时时间（毫秒）
     * @return true表示服务已启用，false表示用户未在超时时间内启用服务
     */
    fun ensureAccessibilityServiceEnabled(context: Context, timeout: Long = 60000): Boolean {
        return AccessibilityServiceUtils.ensureAccessibilityServiceEnabled(
            context, 
            JoydLibAccessibilityService::class.java, 
            timeout
        )
    }

    /**
     * 通知所有回调服务已连接
     */
    private fun notifyServiceConnected() {
        synchronized(serviceCallbacks) {
            serviceCallbacks.forEach { it.onServiceConnected() }
        }
    }

    /**
     * 通知所有回调服务已断开
     */
    private fun notifyServiceDisconnected() {
        synchronized(serviceCallbacks) {
            serviceCallbacks.forEach { it.onServiceDisconnected() }
        }
    }

    /**
     * 无障碍服务回调接口
     * 用于监听服务连接和断开事件
     */
    interface AccessibilityServiceCallback {
        /**
         * 当无障碍服务连接时调用
         */
        fun onServiceConnected()

        /**
         * 当无障碍服务断开时调用
         */
        fun onServiceDisconnected()
    }

    /**
     * JoydLib的无障碍服务实现
     * 实际项目中需要在AndroidManifest.xml中注册此服务
     */
    abstract class JoydLibAccessibilityService : AccessibilityService() {
        override fun onServiceConnected() {
            super.onServiceConnected()
            AccessibilityServiceHelper.setService(this)
            Log.d(TAG, "无障碍服务已连接")
        }

        override fun onDestroy() {
            super.onDestroy()
            AccessibilityServiceHelper.setService(null)
            Log.d(TAG, "无障碍服务已断开")
        }
    }
}